Add an offset to render nodes
authorMatthias Clasen <mclasen@redhat.com>
Thu, 4 Aug 2016 05:04:25 +0000 (01:04 -0400)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 18 Oct 2016 10:49:11 +0000 (11:49 +0100)
This will let us account for the difference between
clip and allocation.

gsk/gskrendernode.c
gsk/gskrendernode.h
gsk/gskrendernodeprivate.h

index cb644088ff214c6fc4c9fe714e7c3c2ed5ec4447..45cdd546d0d813db1f84d5e85baace704d81107a 100644 (file)
@@ -178,6 +178,7 @@ gsk_render_node_init (GskRenderNode *self)
 
   graphene_matrix_init_identity (&self->transform);
   graphene_matrix_init_identity (&self->child_transform);
+  graphene_point3d_init (&self->offset, 0.f, 0.f, 0.f);
 
   self->opacity = 1.0;
 
@@ -934,6 +935,23 @@ gsk_render_node_set_transform (GskRenderNode           *node,
   else
     graphene_matrix_init_from_matrix (&node->transform, transform);
 
+  graphene_matrix_translate (&node->transform, &node->offset);
+
+  node->transform_set = !graphene_matrix_is_identity (&node->transform);
+}
+
+void
+gsk_render_node_set_offset (GskRenderNode            *node,
+                            const graphene_point3d_t *offset)
+{
+  g_return_if_fail (GSK_IS_RENDER_NODE (node));
+  g_return_if_fail (node->is_mutable);
+
+  graphene_point3d_scale (&node->offset, -1, &node->offset);
+  graphene_matrix_translate (&node->transform, &node->offset);
+  graphene_point3d_init_from_point (&node->offset, offset);
+  graphene_matrix_translate (&node->transform, &node->offset);
+
   node->transform_set = !graphene_matrix_is_identity (&node->transform);
 }
 
index f5a3cf16057a4f2f15d50c5bb617a34c52bc4fc9..2d03b4bdd29c8d78991adaf16fb60a22621a6100 100644 (file)
@@ -95,6 +95,9 @@ GDK_AVAILABLE_IN_3_22
 void                    gsk_render_node_set_transform           (GskRenderNode           *node,
                                                                  const graphene_matrix_t *transform);
 GDK_AVAILABLE_IN_3_22
+void                    gsk_render_node_set_offset              (GskRenderNode         *node,
+                                                                 const graphene_point3d_t *offset);
+GDK_AVAILABLE_IN_3_22
 void                    gsk_render_node_set_child_transform     (GskRenderNode           *node,
                                                                  const graphene_matrix_t *transform);
 GDK_AVAILABLE_IN_3_22
index 8e6bca844560f171165b853cd19cc0f8b75f568e..3b74eb768a9a0bd3ac2f8a002db7aed0ca868e35 100644 (file)
@@ -53,6 +53,8 @@ struct _GskRenderNode
   /* Transformations applied to the node */
   graphene_matrix_t transform;
 
+  graphene_point3d_t offset;
+
   /* Transformations applied to the children of the node */
   graphene_matrix_t child_transform;